home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / tigeroad.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  4KB  |  184 lines

  1. #include "vidhrdw/generic.h"
  2.  
  3. static unsigned char tigeroad_scrollram[4];
  4. static int flipscreen,bgcharbank;
  5.  
  6.  
  7.  
  8. WRITE_HANDLER( tigeroad_videoctrl_w )
  9. {
  10.     if ((data & 0xff000000) == 0)
  11.     {
  12.         data = (data >> 8) & 0xff;
  13.  
  14.         /* bit 1 flips screen */
  15.         flipscreen = data & 0x02;
  16.  
  17.         /* bit 2 selects bg char bank */
  18.         bgcharbank = (data & 0x04) >> 2;
  19.  
  20.         /* bits 4-5 are unknown, but used */
  21.  
  22.         /* bits 6-7 are coin counters */
  23.         coin_counter_w(0,data & 0x40);
  24.         coin_counter_w(1,data & 0x80);
  25.     }
  26. }
  27.  
  28. WRITE_HANDLER( tigeroad_scroll_w )
  29. {
  30.     COMBINE_WORD_MEM(&tigeroad_scrollram[offset],data);
  31. }
  32.  
  33.  
  34. static void render_background( struct osd_bitmap *bitmap, int priority )
  35. {
  36.     int scrollx =     READ_WORD(&tigeroad_scrollram[0]) & 0xfff; /* 0..4096 */
  37.     int scrolly =    READ_WORD(&tigeroad_scrollram[2]) & 0xfff; /* 0..4096 */
  38.  
  39.     unsigned char *p = memory_region(REGION_GFX4);
  40.  
  41.     int alignx = scrollx%32;
  42.     int aligny = scrolly%32;
  43.  
  44.     int row = scrolly/32;    /* 0..127 */
  45.     int sy = 224+aligny;
  46.  
  47.     int transp0,transp1;
  48.  
  49.     if( priority ){ /* foreground */
  50.         transp0 = 0xFFFF;    /* draw nothing (all pens transparent) */
  51.         transp1 = 0x01FF;    /* high priority half of tile */
  52.     }
  53.     else { /* background */
  54.         transp0 = 0;        /* NO_TRANSPARENCY */
  55.         transp1 = 0xFE00;    /* low priority half of tile */
  56.     }
  57.  
  58.     while( sy>-32 ){
  59.         int col = scrollx/32;    /* 0..127 */
  60.         int sx = -alignx;
  61.  
  62.         while( sx<256 ){
  63.             int offset = 2*(col%8) + 16*(row%8) + 128*(col/8) + 2048*(row/8);
  64.  
  65.             int code = p[offset];
  66.             int attr = p[offset+1];
  67.  
  68.             int flipx = attr & 0x20;
  69.             int flipy = 0;
  70.             int color = attr & 0x0f;
  71.  
  72.             if (flipscreen)
  73.                 drawgfx(bitmap,Machine->gfx[1],
  74.                         code + ((attr & 0xc0) << 2) + (bgcharbank << 10),
  75.                         color,
  76.                         !flipx,!flipy,
  77.                         224-sx,224-sy,
  78.                         &Machine->drv->visible_area,
  79.                         TRANSPARENCY_PENS,(attr & 0x10) ? transp1 : transp0);
  80.             else
  81.                 drawgfx(bitmap,Machine->gfx[1],
  82.                         code + ((attr & 0xc0) << 2) + (bgcharbank << 10),
  83.                         color,
  84.                         flipx,flipy,
  85.                         sx,sy,
  86.                         &Machine->drv->visible_area,
  87.                         TRANSPARENCY_PENS,(attr & 0x10) ? transp1 : transp0);
  88.  
  89.             sx+=32;
  90.             col++;
  91.             if( col>=128 ) col-=128;
  92.         }
  93.         sy-=32;
  94.         row++;
  95.         if( row>=128 ) row-=128;
  96.     }
  97. }
  98.  
  99. static void render_sprites( struct osd_bitmap *bitmap )
  100. {
  101.     unsigned char *source = &spriteram[spriteram_size] - 8;
  102.     unsigned char *finish = spriteram;
  103.  
  104.     while( source>=finish )
  105.     {
  106.         int tile_number = READ_WORD( source );
  107.         if( tile_number!=0xFFF ){
  108.             int attributes = READ_WORD( source+2 );
  109.             int sy = READ_WORD( source+4 ) & 0x1ff;
  110.             int sx = READ_WORD( source+6 ) & 0x1ff;
  111.  
  112.             int flipx = attributes&2;
  113.             int flipy = attributes&1;
  114.             int color = (attributes>>2)&0xf;
  115.  
  116.             if( sx>0x100 ) sx -= 0x200;
  117.             if( sy>0x100 ) sy -= 0x200;
  118.  
  119.             if (flipscreen)
  120.             {
  121.                 sx = 240 - sx;
  122.                 sy = 240 - sy;
  123.                 flipx = !flipx;
  124.                 flipy = !flipy;
  125.             }
  126.  
  127.             drawgfx(bitmap,Machine->gfx[2],
  128.                 tile_number,
  129.                 color,
  130.                 flipx,flipy,
  131.                 sx,240-sy,
  132.                 &Machine->drv->visible_area,
  133.                 TRANSPARENCY_PEN,15);
  134.         }
  135.         source-=8;
  136.     }
  137. }
  138.  
  139. static void render_text( struct osd_bitmap *bitmap )
  140. {
  141.     int offs;
  142.  
  143.  
  144.     for (offs = 0;offs < videoram_size;offs += 2)
  145.     {
  146.         int sx,sy;
  147.         int data = READ_WORD(&videoram[offs]);
  148.         int attr = data >> 8;
  149.         int code = data & 0xff;
  150.         int color = attr & 0x0f;
  151.         int flipy = attr & 0x10;
  152.  
  153.         sx = (offs / 2) % 32;
  154.         sy = (offs / 2) / 32;
  155.  
  156.         if (flipscreen)
  157.         {
  158.             sx = 31 - sx;
  159.             sy = 31 - sy;
  160.             flipy = !flipy;
  161.         }
  162.  
  163.         drawgfx(bitmap,Machine->gfx[0],
  164.                 code + ((attr & 0xc0) << 2) + ((attr & 0x20) << 5),
  165.                 color,
  166.                 flipscreen,flipy,
  167.                 8*sx,8*sy,
  168.                 &Machine->drv->visible_area, TRANSPARENCY_PEN,3);
  169.     }
  170. }
  171.  
  172.  
  173.  
  174. void tigeroad_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  175. {
  176.     palette_recalc();
  177.     /* no need to check the return code since we redraw everything each frame */
  178.  
  179.     render_background( bitmap,0 );
  180.     render_sprites( bitmap );
  181.     render_background( bitmap,1 );
  182.     render_text( bitmap );
  183. }
  184.